﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = arr;
//	printf("%d\n", *p);
//
//
//
//	return 0;
//
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("%zd\n", sizeof(arr));
//	return 0;
//}

//%p - 专门用来打印地址，是16进制的形式，前面的0不会省略

//int main()//取出来的地址是16进制
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("arr           = %p\n", arr);
//	printf("arr+1         = %p\n", arr+1);
//	printf("&arr[0]       = %p\n", &arr[0]);
//	printf("&arr[0]+1     = %p\n", &arr[0]+1);
//	printf("&arr          = %p\n", &arr);
//	printf("&arr+1        = %p\n", &arr+2);
//	return 0;
//}

//int main()
//{
//	int* p = NULL;
//	int arr[10] = { 0 };
//	p = &arr[0];
//	return 0;
//}


//int main()
//{
//	int arr[10] = {0};
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* p = arr;
//	for (int i = 0; i < sz; i++)
//	{
//		scanf("%d ",p+i);
//		//p++;
//	}
//	p = arr;
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ",*(p +i));
//		//p++;
//	}
//	return 0;
//}




//一维数组的本质
//void test(int arr[10])
//{
//	int sz2 = sizeof(arr) / sizeof(arr[0]);
//	printf("sz2 = %d\n", sz2);
//}
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz1 = sizeof(arr) / sizeof(arr[0]);
//	printf("sz1 = %d\n", sz1);
//	test(arr);
//	return 0;
//}

//void test(int arr[10])
//{
	//int sz2 = sizeof(arr) / sizeof(arr[0]);//
	//在函数参数内求部分参数的数组的元素个数是错误的
	//printf("sz2 = %d\n", sz2);
	
//}
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz1 = sizeof(arr) / sizeof(arr[0]);
//	printf("sz1 = %d\n", sz1);
//	test(arr);
//	return 0;
//}


//int main()
//{
//	int arr[10] = { 0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* p = arr;
//	for (int i = 0; i < sz; i++)
//	{
//		//scanf("%d ", p);
//		//scanf("%d ", arr[i]);
//		scanf("%d ", &arr[i]);
//		//p++;
//	}
//	p = arr;
//	for (int i = 0; i < sz; i++)
//	{
//		//printf("%d ",*p);
//		//printf("%d ",arr[i]);
//		printf("%d ",*(arr+i));
//		//p++;
//	}
//	return 0;
//}


//冒泡排序
//两两相邻的元素进⾏⽐较
//void bubble_sort(int arr[], int sz)
//{
//	//由于是需要排序，所以需要知道需要知道拍多少趟
//	int i = 0;
//	for (i = 0; i < sz;i++)
//	{
//		int j = 0;
//		for (j = 0; j< sz-1-i; j++)
//		{
//			//需要相邻的两个元素进行比较
//			//arr[j]和arr[j+1]
//			if (arr[j] > arr[j + 1])
//				//当知道第一个元素大于第二个元数就将第一个元素与第二个元素交换
//			{
//
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//			}
//
//		}
//	}
//
//}
//void print(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//int main()
//{
//	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
//	//将arr数组排列成升序
//	//冒泡排序:两两相邻的元素进⾏⽐较
//	int sz = sizeof(arr) / sizeof(arr[0]);//求出元素个数
//	bubble_sort(arr, sz);//将数组和元素个数传给函数
//	print(arr, sz);
//	return 0;
//}


//void bubble_sort(int arr[], int sz)
//{
//	int i = 0;
//	int count = 0;
//	for (i = 0; i < sz-1;i++)
//	{
//		int flag = 1;//假设已经有序
//		int j = 0;
//		for (j = 0; j< sz-1-i; j++)
//		{
//			count++;
//			//要是想知道打印多少次
//			if (arr[j] > arr[j + 1])
//			{
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//				flag = 0;//当他发生交换了证明是无序就将flag ==0
//			}
//		}
//		if (flag == 1)//要是没有发生交换，就证明已经是有序了
//			break;
//
//	}
//	printf("count = %d\n",count);
//
//}
//void print(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//int main()
//{
//	int arr[10] = { 1,3,6,8,2,4,0,7,5,9 };
//	//将arr数组排列成升序
//	//冒泡排序:两两相邻的元素进⾏⽐较
//	int sz = sizeof(arr) / sizeof(arr[0]);//求出元素个数
//	bubble_sort(arr, sz);//将数组和元素个数传给函数
//	print(arr, sz);
//	return 0;
//}


//void my_arr(int* arr, int sz)
//{
//	int* p = arr;
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", *p);
//		p++;
//	}
//}
//int main()
//{
//	int arr[10] = {1,2,3,4,5,6,7,8,9,10};//创建一个数组
//	int sz = sizeof(arr) / sizeof(arr[10]);//求出数组元素个数
//	my_arr(arr, sz);//将数组用指针的方式进行输出
//	return 0;
//}

//使用冒泡排序
//void print(int arr[10], int sz)
//{
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//void bubble_sort(int arr[], int sz)
//{
//	int i = 0;
//	int count = 0;
//	for (i = 0; i < sz - 1;i++)
//	{
//		int j = 0;
//		int flag = 1;
//		for (j = 0; j < sz - 1 - i;j++)
//		{
//			count++;
//			if (arr[j] > arr[j + 1])
//			{
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//                arr[j + 1] = tmp;
//				flag = 0;
//			}
//		}
//		if (flag == 1)
//			break;
//	}
//	printf("count = %d\n", count);
//}
//int main()
//{
//	int arr[10] = { 1,2,3,8,5,0,6,9,4,7 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz);
//	int i = 0;
//	print(arr, sz);
//	return 0;
//}


//二级指针
//二级指针变量是用来存放一级指针的地址
//int main()
//{
//	int a = 10;//一级指针
//	int* pa = &a;//pa是指针变量，pa是一级指针
//	int** ppa = &pa;
//	a = 200;
//	printf("%d\n", **ppa);
//	return 0;
//}

//指针数组
//用来存放指针的数组

//int main()
//{
//	int a = 10;
//	int b = 20;
//	int c = 30;
//	int* arr[3] = { &a,&b,&c };
//	//arr就是数组指针
//	return 0;
//}


//使用一个指针数组模拟一个二位数组

int main()
{
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[5] = { 2,3,4,5,6 };
	int arr3[5] = { 3,4,5,6,7 };
	int* arr[] = { arr1,arr2,arr3 };
	//arr是指针数组
	int i = 0;
	for (i = 0;i < 3; i++)//有三个元素
	{
		int j = 0;
		for (j = 0; j < 5;j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}
